home *** CD-ROM | disk | FTP | other *** search
/ Power Programmierung 2 / Power-Programmierung CD 2 (Tewi)(1994).iso / c / library / bcfamily / source / vioconfi.cpp < prev    next >
Encoding:
C/C++ Source or Header  |  1993-06-12  |  3.4 KB  |  128 lines

  1. //
  2. //      *******************************************************************
  3. //        JdeBP C++ Library Routines          General Public Licence v1.00
  4. //            Copyright (c) 1991,1992     Jonathan de Boyne Pollard
  5. //      *******************************************************************
  6. //
  7. // Part of FamAPI.LIB
  8. //
  9.  
  10. #include "famapi.h"
  11. #include "vio.h"
  12.  
  13. //
  14. //    Test for presence of 6845
  15. //
  16. static
  17. int
  18. test_6845 ( int addr )
  19. {
  20.     unsigned char prev, curr ;
  21.     int delay = 0 ;
  22.  
  23.     outportb(addr, '\x0a');    // Write to CRTC register 10 -- cursor start line
  24.     ++addr;
  25.     prev = inportb(addr);
  26.     outportb(addr, '\xff');
  27.     while (delay < 0x100) ++delay;
  28.     curr = inportb(addr);
  29.     outportb(addr, prev);
  30.     return (curr == prev);
  31. }
  32.  
  33. #pragma argsused
  34. //
  35. //    Get video configuration
  36. //
  37. //    Known bugs :    Does not return memory board size for VGA/CGA/MONO
  38. //
  39. USHORT _APICALL
  40. VioGetConfig  ( unsigned short ConfigID,
  41.                 VIOCONFIGINFO far *PtrConfig,
  42.                 unsigned short VioHandle )
  43. {
  44.     enum testflags { VGA = 8, EGA = 4, CGA = 2, MONO = 1 } ;
  45.     int test = VGA|EGA|CGA|MONO ;
  46.  
  47.     //
  48.     //    Only the VGA BIOS distiguishes active and inactive displays.
  49.     //    However it does not give PRIMARY or SECONDARY displays.
  50.     //
  51.  
  52.     USHORT DCC ;        // VGA display combination code
  53. #define    ACTIVE    0xff
  54.  
  55.     // Call VGA VBIOS -- Return card and monitor
  56.     if (!VioDosGetDCC(&DCC)) {
  57.         PtrConfig->adapter = PtrConfig->display = 0 ;
  58.         switch (DCC & ACTIVE) {
  59.             case 1:    PtrConfig->adapter = 0 ; break ;    // MDA/HGC card
  60.             case 2: PtrConfig->adapter = 1 ; break ;    // CGA card
  61.             case 4:
  62.             case 5:    PtrConfig->adapter = 2 ; break ;    // EGA card
  63.             case 7:
  64.             case 8: PtrConfig->adapter = 3 ; break ;    // VGA card
  65.         }
  66.         switch (DCC & ACTIVE) {
  67.             case 1:    PtrConfig->display = 0 ; break ;    // Monochrome
  68.             case 2: PtrConfig->display = 1 ; break ;    // Colour
  69.             case 4:    PtrConfig->display = 2 ; break ;    // HiRes EGA
  70.             case 5:    PtrConfig->display = 0 ; break ;    // Monochrome
  71.             case 7: PtrConfig->display = 3 ; break ;    // Analogue Monochrome
  72.             case 8: PtrConfig->display = 4 ; break ;    // Analogue Colour
  73.         }
  74.         test &= ~(VGA|EGA|CGA) ;
  75.         if (PtrConfig->adapter) test &= ~(MONO) ;
  76.     }
  77.     // Call EGA VBIOS -- Return DIP switch settings
  78.     if (test & EGA) {
  79.         USHORT dipswitch, memsize ;
  80.         if (!VioDosGetEGASettings(&dipswitch, &memsize)) {
  81.             switch (dipswitch) {
  82.                 case 0:
  83.                 case 1:
  84.                 case 2:
  85.                 case 3:        PtrConfig->display = 0 ; break ;    // Monochrome
  86.                 case 4:
  87.                 case 5:        PtrConfig->display = 1 ; break ;    // Colour
  88.                 case 6:
  89.                 case 7:        PtrConfig->display = 2 ; break ;    // Colour EGA
  90.                 case 8:
  91.                 case 9:        PtrConfig->display = 4 ; break ;    // HiRes EGA
  92.                 case 10:
  93.                 case 11:    PtrConfig->display = 3 ; break ;    // Monochrome
  94.             }
  95.             if (dipswitch > 5) {
  96.                 PtrConfig->adapter = 2 ;        // EGA card
  97.             } else if (dipswitch > 3) {
  98.                 PtrConfig->adapter = 1 ;        // CGA card
  99.             } else {
  100.                 PtrConfig->adapter = 0 ;        // MDA/HGC card
  101.             }
  102.             PtrConfig->cbMemory = (memsize + 1) << 16 ;
  103.             test &= ~(EGA|CGA|MONO) ;
  104.         }
  105.     }
  106.     if (test & CGA) {
  107.         if (test_6845(0x03d4)) {
  108.             PtrConfig->adapter = 1;
  109.             PtrConfig->display = 1;
  110.             test &= ~(CGA|MONO) ;
  111.         }
  112.     }
  113.     if (test & MONO) {
  114.         if (test_6845(0x03b4)) {
  115.             int counter, prev;
  116.  
  117.             PtrConfig->adapter = PtrConfig->display = 0 ;
  118.  
  119.             prev = inp(0x03ba);
  120.             for (counter = 0; counter < 0x1000; counter ++) {
  121.                 if (inp(0x03ba) != prev) break ;        // Hercules card
  122.             }
  123.             test &= ~(MONO) ;
  124.         }
  125.     }
  126.  
  127.     return (test != 0) ? ERROR_VIO_MODE : NO_ERROR;
  128. }